
 <!DOCTYPE HTML>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  
    <title>HashMap遍历方式及其性能 | wustrive&#39;s blog</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3, minimum-scale=1">
    
    <meta name="author" content="wustrive">
    
    <meta name="description" content="HashMap的四种遍历方式
for each map.entrySet()
12345Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;String, String&amp;gt;();for (Entry&amp;lt;String, String&amp;gt; entry">
    
    
    
    <meta name="twitter:card" content="summary" />
    <meta name="twitter:site" content="wustrive" />
    <meta name="twitter:title" content="HashMap遍历方式及其性能 | wustrive&#39;s blog" />
      
    
    
    <link rel="alternate" href="/atom.xml" title="wustrive&#39;s blog" type="application/atom+xml">
    
    
    <link rel="icon" href="/img/favicon.ico">
    
    
    <link rel="apple-touch-icon" href="/img/logo.ico">
    <link rel="apple-touch-icon-precomposed" href="/img/logo.ico">
    
    <link rel="stylesheet" href="/css/style.css">
    <script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "//hm.baidu.com/hm.js?5829c94e2ff91660826b6c0c188f5620";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
    </script>

</head>

  <body>
    <header>
      <div>
		
			<div id="imglogo">
				<a href="/"><img src="/img/logo.png" alt="wustrive&#39;s blog" title="wustrive&#39;s blog"/></a>
			</div>
			
			<div id="textlogo">
				<h1 class="site-name"><a href="/" title="wustrive&#39;s blog">wustrive&#39;s blog</a></h1>
				<h2 class="blog-motto">好记性不如写博客</h2>
			</div>
			<div class="navbar"><a class="navbutton navmobile" href="#" title="菜单">
			</a></div>
			<nav class="animated">
				<ul>
					
						<li><a href="/">主页</a></li>
					
						<li><a href="/archives">归档</a></li>
					
						<li><a href="/aboutme">关于</a></li>
					
					<li>
					
					<form class="search" action="//google.com/search" method="get" accept-charset="utf-8">
						<label>Search</label>
						<input type="text" id="search" name="q" autocomplete="off" maxlength="20" placeholder="搜索" />
						<input type="hidden" name="q" value="site:wustrive2008.github.io">
					</form>
					
					</li>
				</ul>
			</nav>			
</div>

    </header>
    <div id="container">
      <div id="main" class="post" itemscope itemprop="blogPost">
	<article itemprop="articleBody"> 
		<header class="article-info clearfix">
  <h1 itemprop="name">
    
      <a href="/2015/08/11/java/HashMap遍历及性能/" title="HashMap遍历方式及其性能" itemprop="url">HashMap遍历方式及其性能</a>
  </h1>
  <p class="article-author">By
    
      <a href="https://wustrive2008.github.io" title="wustrive">wustrive</a>
    </p>
  <p class="article-time">
    <time datetime="2015-08-11T11:46:49.000Z" itemprop="datePublished">2015-08-11</time>
    更新日期:<time datetime="2016-11-05T18:14:33.000Z" itemprop="dateModified">2016-11-06</time>
    
  </p>
</header>
	<div class="article-content">
		
<div class="article-gallery">
  <div class="article-gallery-photos">
    
      <a class="article-gallery-img fancybox" href="http://7xifb5.com1.z0.glb.clouddn.com/wustrive-hexojava知识结构.png" rel="gallery_civ5jdlgr001cuvfy4khwqlcv">
        <img src="http://7xifb5.com1.z0.glb.clouddn.com/wustrive-hexojava知识结构.png" itemprop="image">
      </a>
    
  </div>
</div>

		
		<div id="toc" class="toc-article">
			<strong class="toc-title">文章目录</strong>
		<ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#HashMap的四种遍历方式"><span class="toc-number">1.</span> <span class="toc-text">HashMap的四种遍历方式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#HashMap四种遍历方式的性能测试及对比"><span class="toc-number">2.</span> <span class="toc-text">HashMap四种遍历方式的性能测试及对比</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#HashMap遍历方式结果分析"><span class="toc-number">3.</span> <span class="toc-text">HashMap遍历方式结果分析</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#结论总结"><span class="toc-number">4.</span> <span class="toc-text">结论总结</span></a></li></ol>
		</div>
		
		<h3 id="HashMap的四种遍历方式">HashMap的四种遍历方式</h3><ol>
<li><p>for each map.entrySet()</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();</div><div class="line">for (Entry&lt;String, String&gt; entry : map.entrySet()) &#123;</div><div class="line">    entry.getKey();</div><div class="line">    entry.getValue();</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>调用map.entrySet()的集合迭代器 </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">Iterator&lt;Map.Entry&lt;String, String&gt;&gt; iterator = map.entrySet().iterator();</div><div class="line">while (iterator.hasNext()) &#123;</div><div class="line">    Map.Entry&lt;String, String&gt; entry = iterator.next();</div><div class="line">    entry.getKey();</div><div class="line">    entry.getValue();</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>for each map.keySet()，再调用get获取</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();</div><div class="line">for (String key : map.keySet()) &#123;</div><div class="line">    map.get(key);</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>for each map.entrySet()，用临时变量保存map.entrySet()</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Set&lt;Entry&lt;String, String&gt;&gt; entrySet = map.entrySet();</div><div class="line">for (Entry&lt;String, String&gt; entry : entrySet) &#123;</div><div class="line">    entry.getKey();</div><div class="line">    entry.getValue();</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ol>
<h3 id="HashMap四种遍历方式的性能测试及对比">HashMap四种遍历方式的性能测试及对比</h3><p>性能测试代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div></pre></td><td class="code"><pre><div class="line">package cn.trinea.java.test;</div><div class="line"></div><div class="line">import java.text.DecimalFormat;</div><div class="line">import java.util.Calendar;</div><div class="line">import java.util.HashMap;</div><div class="line">import java.util.Iterator;</div><div class="line">import java.util.Map;</div><div class="line">import java.util.Map.Entry;</div><div class="line">import java.util.Set;</div><div class="line"> </div><div class="line">/**</div><div class="line"> * JavaLoopTest</div><div class="line"> * </div><div class="line"> * @author www.trinea.cn 2013-10-28</div><div class="line"> */</div><div class="line">public class JavaLoopTest &#123;</div><div class="line"> </div><div class="line">    public static void main(String[] args) &#123;</div><div class="line">        System.out.print(&quot;compare loop performance of HashMap&quot;);</div><div class="line">        loopMapCompare(getHashMaps(10000, 100000, 1000000, 2000000));</div><div class="line">    &#125;</div><div class="line"> </div><div class="line">    public static Map&lt;String, String&gt;[] getHashMaps(int... sizeArray) &#123;</div><div class="line">        Map&lt;String, String&gt;[] mapArray = new HashMap[sizeArray.length];</div><div class="line">        for (int i = 0; i &lt; sizeArray.length; i++) &#123;</div><div class="line">            int size = sizeArray[i];</div><div class="line">            Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();</div><div class="line">            for (int j = 0; j &lt; size; j++) &#123;</div><div class="line">                String s = Integer.toString(j);</div><div class="line">                map.put(s, s);</div><div class="line">            &#125;</div><div class="line">            mapArray[i] = map;</div><div class="line">        &#125;</div><div class="line">        return mapArray;</div><div class="line">    &#125;</div><div class="line"> </div><div class="line">    public static void loopMapCompare(Map&lt;String, String&gt;[] mapArray) &#123;</div><div class="line">        printHeader(mapArray);</div><div class="line">        long startTime, endTime;</div><div class="line"> </div><div class="line">        // Type 1</div><div class="line">        for (int i = 0; i &lt; mapArray.length; i++) &#123;</div><div class="line">            Map&lt;String, String&gt; map = mapArray[i];</div><div class="line">            startTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            for (Entry&lt;String, String&gt; entry : map.entrySet()) &#123;</div><div class="line">                entry.getKey();</div><div class="line">                entry.getValue();</div><div class="line">            &#125;</div><div class="line">            endTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            printCostTime(i, mapArray.length, &quot;for each entrySet&quot;, endTime - startTime);</div><div class="line">        &#125;</div><div class="line"> </div><div class="line">        // Type 2</div><div class="line">        for (int i = 0; i &lt; mapArray.length; i++) &#123;</div><div class="line">            Map&lt;String, String&gt; map = mapArray[i];</div><div class="line">            startTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            Iterator&lt;Map.Entry&lt;String, String&gt;&gt; iterator = map.entrySet().iterator();</div><div class="line">            while (iterator.hasNext()) &#123;</div><div class="line">                Map.Entry&lt;String, String&gt; entry = iterator.next();</div><div class="line">                entry.getKey();</div><div class="line">                entry.getValue();</div><div class="line">            &#125;</div><div class="line">            endTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            printCostTime(i, mapArray.length, &quot;for iterator entrySet&quot;, endTime - startTime);</div><div class="line">        &#125;</div><div class="line"> </div><div class="line">        // Type 3</div><div class="line">        for (int i = 0; i &lt; mapArray.length; i++) &#123;</div><div class="line">            Map&lt;String, String&gt; map = mapArray[i];</div><div class="line">            startTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            for (String key : map.keySet()) &#123;</div><div class="line">                map.get(key);</div><div class="line">            &#125;</div><div class="line">            endTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            printCostTime(i, mapArray.length, &quot;for each keySet&quot;, endTime - startTime);</div><div class="line">        &#125;</div><div class="line"> </div><div class="line">        // Type 4</div><div class="line">        for (int i = 0; i &lt; mapArray.length; i++) &#123;</div><div class="line">            Map&lt;String, String&gt; map = mapArray[i];</div><div class="line">            startTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            Set&lt;Entry&lt;String, String&gt;&gt; entrySet = map.entrySet();</div><div class="line">            for (Entry&lt;String, String&gt; entry : entrySet) &#123;</div><div class="line">                entry.getKey();</div><div class="line">                entry.getValue();</div><div class="line">            &#125;</div><div class="line">            endTime = Calendar.getInstance().getTimeInMillis();</div><div class="line">            printCostTime(i, mapArray.length, &quot;for entrySet=entrySet()&quot;, endTime - startTime);</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line"> </div><div class="line">    static int                 FIRST_COLUMN_LENGTH = 23, OTHER_COLUMN_LENGTH = 12, TOTAL_COLUMN_LENGTH = 71;</div><div class="line">    static final DecimalFormat COMMA_FORMAT        = new DecimalFormat(&quot;#,###&quot;);</div><div class="line"> </div><div class="line">    public static void printHeader(Map... mapArray) &#123;</div><div class="line">        printRowDivider();</div><div class="line">        for (int i = 0; i &lt; mapArray.length; i++) &#123;</div><div class="line">            if (i == 0) &#123;</div><div class="line">                StringBuilder sb = new StringBuilder().append(&quot;map size&quot;);</div><div class="line">                while (sb.length() &lt; FIRST_COLUMN_LENGTH) &#123;</div><div class="line">                    sb.append(&quot; &quot;);</div><div class="line">                &#125;</div><div class="line">                System.out.print(sb);</div><div class="line">            &#125;</div><div class="line"> </div><div class="line">            StringBuilder sb = new StringBuilder().append(&quot;| &quot;).append(COMMA_FORMAT.format(mapArray[i].size()));</div><div class="line">            while (sb.length() &lt; OTHER_COLUMN_LENGTH) &#123;</div><div class="line">                sb.append(&quot; &quot;);</div><div class="line">            &#125;</div><div class="line">            System.out.print(sb);</div><div class="line">        &#125;</div><div class="line">        TOTAL_COLUMN_LENGTH = FIRST_COLUMN_LENGTH + OTHER_COLUMN_LENGTH * mapArray.length;</div><div class="line">        printRowDivider();</div><div class="line">    &#125;</div><div class="line"> </div><div class="line">    public static void printRowDivider() &#123;</div><div class="line">        System.out.println();</div><div class="line">        StringBuilder sb = new StringBuilder();</div><div class="line">        while (sb.length() &lt; TOTAL_COLUMN_LENGTH) &#123;</div><div class="line">            sb.append(&quot;-&quot;);</div><div class="line">        &#125;</div><div class="line">        System.out.println(sb);</div><div class="line">    &#125;</div><div class="line"> </div><div class="line">    public static void printCostTime(int i, int size, String caseName, long costTime) &#123;</div><div class="line">        if (i == 0) &#123;</div><div class="line">            StringBuilder sb = new StringBuilder().append(caseName);</div><div class="line">            while (sb.length() &lt; FIRST_COLUMN_LENGTH) &#123;</div><div class="line">                sb.append(&quot; &quot;);</div><div class="line">            &#125;</div><div class="line">            System.out.print(sb);</div><div class="line">        &#125;</div><div class="line"> </div><div class="line">        StringBuilder sb = new StringBuilder().append(&quot;| &quot;).append(costTime).append(&quot; ms&quot;);</div><div class="line">        while (sb.length() &lt; OTHER_COLUMN_LENGTH) &#123;</div><div class="line">            sb.append(&quot; &quot;);</div><div class="line">        &#125;</div><div class="line">        System.out.print(sb);</div><div class="line"> </div><div class="line">        if (i == size - 1) &#123;</div><div class="line">            printRowDivider();</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>PS：如果运行报异常in thread “main” java.lang.OutOfMemoryError: Java heap space，请将main函数里面map size的大小减小。<br>其中getHashMaps函数会返回不同size的HashMap。<br>loopMapCompare函数会分别用上面的遍历方式1-4去遍历每一个map数组(包含不同大小HashMap)中的HashMap。<br>print开头函数为输出辅助函数，可忽略。</p>
<p>测试环境为Windows7 32位系统 3.2G双核CPU 4G内存，Java 7，Eclipse -Xms512m -Xmx512m<br>最终测试结果如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">compare loop performance of HashMap</div><div class="line">-----------------------------------------------------------------------</div><div class="line">map size               | 10,000    | 100,000   | 1,000,000 | 2,000,000 </div><div class="line">-----------------------------------------------------------------------</div><div class="line">for each entrySet      | 2 ms      | 6 ms      | 36 ms     | 91 ms     </div><div class="line">-----------------------------------------------------------------------</div><div class="line">for iterator entrySet  | 0 ms      | 4 ms      | 35 ms     | 89 ms     </div><div class="line">-----------------------------------------------------------------------</div><div class="line">for each keySet        | 1 ms      | 6 ms      | 48 ms     | 126 ms    </div><div class="line">-----------------------------------------------------------------------</div><div class="line">for entrySet=entrySet()| 1 ms      | 4 ms      | 35 ms     | 92 ms     </div><div class="line">-----------------------------------------------------------------------</div></pre></td></tr></table></figure>
<p>表横向为同一遍历方式不同大小HashMap遍历的时间消耗，纵向为同一HashMap不同遍历方式遍历的时间消耗。<br>PS：由于首次遍历HashMap会稍微多耗时一点，for each的结果稍微有点偏差，将测试代码中的几个Type顺序调换会发现，for each entrySet耗时和for iterator entrySet接近。</p>
<h3 id="HashMap遍历方式结果分析">HashMap遍历方式结果分析</h3><p>从上面知道for each与显示调用Iterator等价，上表的结果中可以看出除了第三种方式(for each map.keySet())，再调用get获取方式外，其他三种方式性能相当。本例还是hash值散列较好的情况，若散列算法较差，第三种方式会更加耗时。<br>我们看看HashMap entrySet和keySet的源码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">private final class KeyIterator extends HashIterator&lt;K&gt; &#123;</div><div class="line">    public K next() &#123;</div><div class="line">        return nextEntry().getKey();</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"> </div><div class="line">private final class EntryIterator extends HashIterator&lt;Map.Entry&lt;K,V&gt;&gt; &#123;</div><div class="line">    public Map.Entry&lt;K,V&gt; next() &#123;</div><div class="line">        return nextEntry();</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>分别是keySet()和entrySet()返回的set的迭代器，从中我们可以看到只是返回值不同而已，父类相同，所以性能相差不多。只是第三种方式多了一步根据key get得到value的操作而已。get的时间复杂度根据hash算法而异，源码如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">public V get(Object key) &#123;</div><div class="line">    if (key == null)</div><div class="line">        return getForNullKey();</div><div class="line">    Entry&lt;K,V&gt; entry = getEntry(key);</div><div class="line"> </div><div class="line">    return null == entry ? null : entry.getValue();</div><div class="line">&#125;</div><div class="line"> </div><div class="line">/**</div><div class="line"> * Returns the entry associated with the specified key in the</div><div class="line"> * HashMap.  Returns null if the HashMap contains no mapping</div><div class="line"> * for the key.</div><div class="line"> */</div><div class="line">final Entry&lt;K,V&gt; getEntry(Object key) &#123;</div><div class="line">    int hash = (key == null) ? 0 : hash(key);</div><div class="line">    for (Entry&lt;K,V&gt; e = table[indexFor(hash, table.length)];</div><div class="line">         e != null;</div><div class="line">         e = e.next) &#123;</div><div class="line">        Object k;</div><div class="line">        if (e.hash == hash &amp;&amp;</div><div class="line">            ((k = e.key) == key || (key != null &amp;&amp; key.equals(k))))</div><div class="line">            return e;</div><div class="line">    &#125;</div><div class="line">    return null;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>get的时间复杂度取决于for循环循环次数，即hash算法。</p>
<h3 id="结论总结">结论总结</h3><p>从上面的分析来看：<br>a. HashMap的循环，如果既需要key也需要value，直接用<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();</div><div class="line">for (Entry&lt;String, String&gt; entry : map.entrySet()) &#123;</div><div class="line">    entry.getKey();</div><div class="line">    entry.getValue();</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>即可，foreach简洁易懂。</p>
<p>b. 如果只是遍历key而无需value的话，可以直接用<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();</div><div class="line">for (String key : map.keySet()) &#123;</div><div class="line">    // key process</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>参考：<a href="http://www.trinea.cn/android/hashmap-loop-performance/" target="_blank" rel="external">HashMap循环遍历方式及其性能对比</a></p>
  
	</div>
		<footer class="article-footer clearfix">

  <div class="article-tags">
  
  <span></span> <a href="/tags/java/">java</a><a href="/tags/性能/">性能</a><a href="/tags/hashmap/">hashmap</a>
  </div>


<div class="article-categories">
  <span></span>
  <a class="article-category-link" href="/categories/java/">java</a>
</div>



<div class="article-share" id="share">

  <div data-url="https://wustrive2008.github.io/2015/08/11/java/HashMap遍历及性能/" data-title="HashMap遍历方式及其性能 | wustrive&#39;s blog" data-tsina="null" class="share clearfix">
  </div>

</div>
</footer>   	       
	</article>
	
<nav class="article-nav clearfix">
 
 <div class="prev" >
 <a href="/2015/08/11/java/ArrayList和LinkedList的遍历和性能分析/" title="ArrayList和LinkedList的遍历和性能分析">
  <strong>PREVIOUS:</strong><br/>
  <span>
  ArrayList和LinkedList的遍历和性能分析</span>
</a>
</div>


<div class="next">
<a href="/2015/08/09/读书笔记/读书笔记-心理罪/"  title="心理罪">
 <strong>NEXT:</strong><br/> 
 <span>心理罪
</span>
</a>
</div>

</nav>

	
<section class="comment">
	<div class="ds-thread"></div>
</section>

</div>  
      <div class="openaside"><a class="navbutton" href="#" title="显示侧边栏"></a></div>

  <div id="toc" class="toc-aside">
  <strong class="toc-title">文章目录</strong>
  <ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#HashMap的四种遍历方式"><span class="toc-number">1.</span> <span class="toc-text">HashMap的四种遍历方式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#HashMap四种遍历方式的性能测试及对比"><span class="toc-number">2.</span> <span class="toc-text">HashMap四种遍历方式的性能测试及对比</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#HashMap遍历方式结果分析"><span class="toc-number">3.</span> <span class="toc-text">HashMap遍历方式结果分析</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#结论总结"><span class="toc-number">4.</span> <span class="toc-text">结论总结</span></a></li></ol>
  </div>

<div id="asidepart">
<div class="closeaside"><a class="closebutton" href="#" title="隐藏侧边栏"></a></div>
<aside class="clearfix">

  
<div class="categorieslist">
	<p class="asidetitle">分类</p>
		<ul>
		
			<li><a href="/categories/DB/" title="DB">DB<sup>1</sup></a></li>
		
			<li><a href="/categories/Linux/" title="Linux">Linux<sup>6</sup></a></li>
		
			<li><a href="/categories/UML/" title="UML">UML<sup>1</sup></a></li>
		
			<li><a href="/categories/cORc/" title="cORc++">cORc++<sup>1</sup></a></li>
		
			<li><a href="/categories/hexo/" title="hexo">hexo<sup>1</sup></a></li>
		
			<li><a href="/categories/http协议/" title="http协议">http协议<sup>2</sup></a></li>
		
			<li><a href="/categories/java/" title="java">java<sup>10</sup></a></li>
		
			<li><a href="/categories/js/" title="js">js<sup>1</sup></a></li>
		
			<li><a href="/categories/nginx/" title="nginx">nginx<sup>1</sup></a></li>
		
			<li><a href="/categories/python/" title="python">python<sup>2</sup></a></li>
		
			<li><a href="/categories/分享/" title="分享">分享<sup>1</sup></a></li>
		
			<li><a href="/categories/摘录/" title="摘录">摘录<sup>1</sup></a></li>
		
			<li><a href="/categories/版本控制/" title="版本控制">版本控制<sup>3</sup></a></li>
		
			<li><a href="/categories/算法/" title="算法">算法<sup>2</sup></a></li>
		
			<li><a href="/categories/缓存/" title="缓存">缓存<sup>1</sup></a></li>
		
			<li><a href="/categories/网络协议/" title="网络协议">网络协议<sup>1</sup></a></li>
		
			<li><a href="/categories/网络安全/" title="网络安全">网络安全<sup>1</sup></a></li>
		
			<li><a href="/categories/设计模式/" title="设计模式">设计模式<sup>2</sup></a></li>
		
			<li><a href="/categories/读书笔记/" title="读书笔记">读书笔记<sup>10</sup></a></li>
		
		</ul>
</div>


  
<div class="tagslist">
	<p class="asidetitle">标签</p>
		<ul class="clearfix">
		
			<li><a href="/tags/Arraylist/" title="Arraylist">Arraylist<sup>1</sup></a></li>
		
			<li><a href="/tags/Centos/" title="Centos">Centos<sup>2</sup></a></li>
		
			<li><a href="/tags/DB/" title="DB">DB<sup>1</sup></a></li>
		
			<li><a href="/tags/Docker/" title="Docker">Docker<sup>1</sup></a></li>
		
			<li><a href="/tags/Email/" title="Email">Email<sup>1</sup></a></li>
		
			<li><a href="/tags/HashMap/" title="HashMap">HashMap<sup>1</sup></a></li>
		
			<li><a href="/tags/HotSpot/" title="HotSpot">HotSpot<sup>1</sup></a></li>
		
			<li><a href="/tags/IMAP/" title="IMAP">IMAP<sup>1</sup></a></li>
		
			<li><a href="/tags/Java/" title="Java">Java<sup>1</sup></a></li>
		
			<li><a href="/tags/Linux/" title="Linux">Linux<sup>5</sup></a></li>
		
			<li><a href="/tags/OOM/" title="OOM">OOM<sup>1</sup></a></li>
		
			<li><a href="/tags/POP3/" title="POP3">POP3<sup>1</sup></a></li>
		
			<li><a href="/tags/SMTP/" title="SMTP">SMTP<sup>1</sup></a></li>
		
			<li><a href="/tags/Tomcat/" title="Tomcat">Tomcat<sup>1</sup></a></li>
		
			<li><a href="/tags/UML/" title="UML">UML<sup>1</sup></a></li>
		
			<li><a href="/tags/aes/" title="aes">aes<sup>1</sup></a></li>
		
			<li><a href="/tags/array/" title="array">array<sup>1</sup></a></li>
		
			<li><a href="/tags/arraylist/" title="arraylist">arraylist<sup>1</sup></a></li>
		
			<li><a href="/tags/c/" title="c">c<sup>2</sup></a></li>
		
			<li><a href="/tags/chkconfig/" title="chkconfig">chkconfig<sup>1</sup></a></li>
		
		</ul>
</div>


  <div class="rsspart">
	<a href="/atom.xml" target="_blank" title="rss">RSS 订阅</a>
</div>

</aside>
</div>
    </div>
    <footer><div id="footer" >
	
	<div class="line">
		<span></span>
		<div class="author"></div>
	</div>
	
	
	<section class="info">
		<p> Hello, I&#39;m wustrive. This is my blog on GitHub. <br/>
			I wish you happiness</p>
	</section>
	 
	<div class="social-font clearfix">
		
		<a href="http://weibo.com/12100106" target="_blank" title="weibo"></a>
		
		
		<a href="https://twitter.com/wustrive" target="_blank" title="twitter"></a>
		
		
		<a href="https://github.com/wustrive2008" target="_blank" title="github"></a>
		
		
		
	</div>
		<p class="copyright">Powered by <a href="http://hexo.io" target="_blank" title="hexo">hexo</a> and Theme by <a href="https://github.com/A-limon/pacman" target="_blank" title="Pacman">Pacman</a> © 2018 
		
		<a href="https://wustrive2008.github.io" target="_blank" title="wustrive">wustrive</a>
		
		</p>
</div>
</footer>
    <script src="/js/jquery-2.1.0.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  $('.navbar').click(function(){
    $('header nav').toggleClass('shownav');
  });
  var myWidth = 0;
  function getSize(){
    if( typeof( window.innerWidth ) == 'number' ) {
      myWidth = window.innerWidth;
    } else if( document.documentElement && document.documentElement.clientWidth) {
      myWidth = document.documentElement.clientWidth;
    };
  };
  var m = $('#main'),
      a = $('#asidepart'),
      c = $('.closeaside'),
      o = $('.openaside');
  $(window).resize(function(){
    getSize(); 
    if (myWidth >= 1024) {
      $('header nav').removeClass('shownav');
    }else
    {
      m.removeClass('moveMain');
      a.css('display', 'block').removeClass('fadeOut');
      o.css('display', 'none');
      
      $('#toc.toc-aside').css('display', 'none');
        
    }
  });
  c.click(function(){
    a.addClass('fadeOut').css('display', 'none');
    o.css('display', 'block').addClass('fadeIn');
    m.addClass('moveMain');
  });
  o.click(function(){
    o.css('display', 'none').removeClass('beforeFadeIn');
    a.css('display', 'block').removeClass('fadeOut').addClass('fadeIn');      
    m.removeClass('moveMain');
  });
  $(window).scroll(function(){
    o.css("top",Math.max(80,260-$(this).scrollTop()));
  });
});
</script>

<script type="text/javascript">
$(document).ready(function(){ 
  var ai = $('.article-content>iframe'),
      ae = $('.article-content>embed'),
      t  = $('#toc'),
      h  = $('article h2')
      ah = $('article h2'),
      ta = $('#toc.toc-aside'),
      o  = $('.openaside'),
      c  = $('.closeaside');
  if(ai.length>0){
    ai.wrap('<div class="video-container" />');
  };
  if(ae.length>0){
   ae.wrap('<div class="video-container" />');
  };
  if(ah.length==0){
    t.css('display','none');
  }else{
    c.click(function(){
      ta.css('display', 'block').addClass('fadeIn');
    });
    o.click(function(){
      ta.css('display', 'none');
    });
    $(window).scroll(function(){
      ta.css("top",Math.max(140,320-$(this).scrollTop()));
    });
  };
});
</script>


<script type="text/javascript">
$(document).ready(function(){ 
  var $this = $('.share'),
      url = $this.attr('data-url'),
      encodedUrl = encodeURIComponent(url),
      title = $this.attr('data-title'),
      tsina = $this.attr('data-tsina');
  var html = [
  '<a href="#" class="overlay" id="qrcode"></a>',
  '<div class="qrcode clearfix"><span>扫描二维码分享到微信朋友圈</span><a class="qrclose" href="#share"></a><strong>Loading...Please wait</strong><img id="qrcode-pic" data-src="http://s.jiathis.com/qrcode.php?url=' + encodedUrl + '"/></div>',
  '<a href="#textlogo" class="article-back-to-top" title="Top"></a>',
  '<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="article-share-facebook" target="_blank" title="Facebook"></a>',
  '<a href="#qrcode" class="article-share-qrcode" title="QRcode"></a>',
  '<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="article-share-twitter" target="_blank" title="Twitter"></a>',
  '<a href="http://service.weibo.com/share/share.php?title='+title+'&url='+encodedUrl +'&ralateUid='+ tsina +'&searchPic=true&style=number' +'" class="article-share-weibo" target="_blank" title="Weibo"></a>',
  '<span title="Share to"></span>'
  ].join('');
  $this.append(html);
  $('.article-share-qrcode').click(function(){
    var imgSrc = $('#qrcode-pic').attr('data-src');
    $('#qrcode-pic').attr('src', imgSrc);
    $('#qrcode-pic').load(function(){
        $('.qrcode strong').text(' ');
    });
  });
});     
</script>


<script type="text/javascript">
  var duoshuoQuery = {short_name:"wustrive"};
  (function() {
    var ds = document.createElement('script');
    ds.type = 'text/javascript';ds.async = true;
    ds.src = '//static.duoshuo.com/embed.js';
    ds.charset = 'UTF-8';
    (document.getElementsByTagName('head')[0] 
    || document.getElementsByTagName('body')[0]).appendChild(ds);
  })();
</script> 




<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-22190106-2', 'auto');  
ga('send', 'pageview');
</script>


<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-22190106-2', 'auto');
  ga('send', 'pageview');

</script>

  </body>
</html>
